package com.ztgf.file.utils;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

/**
 * @Description:
 * @Author: mxli
 * @Date: 2021-01-12 23:14
 **/
public class WatermarkImgUtils {

    public static void main(String[] args) {
        System.out.println("开始水印：");
        new WatermarkImgUtils().addWatermark("/Users/mxli/Desktop/O1CN01CrU5Mm1zz7Yh7VeIy_!!394316784.jpg", "/Users/mxli/Desktop/水印图片.jpg", "你好，世界！", "jpg");
        System.out.println("水印完成。");
    }

    /**
     * @description
     * @param sourceImgPath 源图片路径
     * @param tarImgPath 保存的图片路径
     * @param waterMarkContent 水印内容
     * @param fileExt 图片格式
     * @return void
     */
    public void addWatermark(String sourceImgPath, String tarImgPath, String waterMarkContent,String fileExt){
        Font font = new Font("宋体", Font.BOLD, 36);//水印字体，大小
        Color markContentColor = Color.black;//水印颜色
        Integer degree = -45;//设置水印文字的旋转角度
        float alpha = 0.5f;//设置水印透明度
        OutputStream outImgStream = null;
        try {
            File srcImgFile = new File(sourceImgPath);//得到文件
            Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
            int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
            int srcImgHeight = srcImg.getHeight(null);//获取图片的高
            // 加水印
            //设置生成图片的宽*高，色彩度
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();//得到画笔
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            g.setColor(markContentColor); //设置水印颜色
            g.setFont(font);              //设置字体
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度
            if (null != degree) {
//                g.rotate(Math.toRadians(degree));//设置水印旋转
                g.rotate(Math.toRadians(degree),(double)bufImg.getWidth(),(double)bufImg.getHeight());//设置水印旋转
            }
            JLabel label = new JLabel(waterMarkContent);
            FontMetrics metrics = label.getFontMetrics(font);
            int width = metrics.stringWidth(label.getText());//文字水印的宽
//            int rowsNumber = srcImgHeight/width + srcImgHeight%width;// 图片的高  除以  文字水印的宽    ——> 打印的行数(以文字水印的宽为间隔)
//            int columnsNumber = srcImgWidth/width + srcImgWidth%width;//图片的宽 除以 文字水印的宽   ——> 每行打印的列数(以文字水印的宽为间隔)

            int rowsNumber = srcImgHeight/width;// 图片的高  除以  文字水印的宽    ——> 打印的行数(以文字水印的宽为间隔)
            int columnsNumber = srcImgWidth/width;//图片的宽 除以 文字水印的宽   ——> 每行打印的列数(以文字水印的宽为间隔)
            System.out.println(srcImgWidth/width+"-------"+srcImgWidth%width);
            //防止图片太小而文字水印太长，所以至少打印一次
            if(rowsNumber < 1){
                rowsNumber = 1;
            }
            if(columnsNumber < 1){
                columnsNumber = 1;
            }
//            for(int j=0;j<rowsNumber;j++){
//                for(int i=0;i<columnsNumber;i++){
//                    int x = i*width + j*width;
//                    int y = -i*width + j*width;
//                    System.out.println("------："+ x+ "-------：" + y);
//                    g.drawString(waterMarkContent, x, y);//画出水印,并设置水印位置
//                }
//                System.out.println("------j："+ j);
//            }


            for(int j=0;j<rowsNumber;j++){
                for(int i=0;i<columnsNumber;i++){
                    g.drawString(waterMarkContent, i*width + j*width, -i*width + j*width);//画出水印,并设置水印位置
                }
            }
//            int x = 0;
//            int y = 0;
//            int markWidth = width;// 字体长度
//            int markHeight = 36;// 字体高度
//
//            // 循环添加水印
//            while (x < srcImgWidth) {
//                y = 0;
//                System.out.println("------x："+ x);
//                while (y < srcImgHeight) {
//
//                    g.drawString (waterMarkContent, x, y);
//                    System.out.println("------："+ x+ "-------：" + y);
//                    y += markHeight + 200;
//                }
//                x += markWidth + 200;
//
//            }
            g.dispose();// 释放资源
            // 输出图片
            outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, fileExt, outImgStream);
        } catch (Exception e) {
            e.printStackTrace();
            e.getMessage();
        } finally{
            try {
                if(outImgStream != null){
                    outImgStream.flush();
                    outImgStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
                e.getMessage();
            }
        }
    }

    /**
     * @description
     * @param sourceImgPath 源图片路径
     * @param tarImgPath 保存的图片路径
     * @param waterMarkContent 水印内容
     * @param fileExt 图片格式
     * @return void
     */
    public void addWatermarkNew(String sourceImgPath, String tarImgPath, String waterMarkContent,String fileExt){
        Font font = new Font("宋体", Font.BOLD, 36);//水印字体，大小
        Color markContentColor = Color.black;//水印颜色
        Integer degree = 135;//设置水印文字的旋转角度
        float alpha = 0.5f;//设置水印透明度
        OutputStream outImgStream = null;
        try {
            File srcImgFile = new File(sourceImgPath);//得到文件
            Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
            int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
            int srcImgHeight = srcImg.getHeight(null);//获取图片的高
            // 加水印
            //针对图片旋转重新计算图的宽*高
            Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(srcImgWidth, srcImgHeight)), degree);
            //设置生成图片的宽*高，色彩度
            BufferedImage bufImg = new BufferedImage(rect_des.width, rect_des.height,BufferedImage.TYPE_INT_RGB);

//            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();//得到画笔
            bufImg = g.getDeviceConfiguration().createCompatibleImage(rect_des.width, rect_des.height, Transparency.TRANSLUCENT);
            g = bufImg.createGraphics();//得到画笔
            g.setColor(markContentColor); //设置水印颜色
            g.setFont(font);              //设置字体
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度
            if (null != degree) {

                //重新设定原点坐标
                g.translate((rect_des.width - srcImgWidth) / 2,(rect_des.height - srcImgHeight) / 2);
                //执行图片旋转，rotate里包含了translate，并还原了原点坐标
                g.rotate(Math.toRadians(degree), srcImgWidth / 2, srcImgWidth / 2);
            }
            JLabel label = new JLabel(waterMarkContent);
            FontMetrics metrics = label.getFontMetrics(font);
            int width = metrics.stringWidth(label.getText());//文字水印的宽
            int rowsNumber = srcImgHeight/width;// 图片的高  除以  文字水印的宽    ——> 打印的行数(以文字水印的宽为间隔)
            int columnsNumber = srcImgWidth/width;//图片的宽 除以 文字水印的宽   ——> 每行打印的列数(以文字水印的宽为间隔)
            //防止图片太小而文字水印太长，所以至少打印一次
            if(rowsNumber < 1){
                rowsNumber = 1;
            }
            if(columnsNumber < 1){
                columnsNumber = 1;
            }
            for(int j=0;j<rowsNumber;j++){
                for(int i=0;i<columnsNumber;i++){
                    g.drawString(waterMarkContent, i*width + j*width, -i*width + j*width);//画出水印,并设置水印位置
                }
            }
            g.dispose();// 释放资源
            // 输出图片
            outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, fileExt, outImgStream);
        } catch (Exception e) {
            e.printStackTrace();
            e.getMessage();
        } finally{
            try {
                if(outImgStream != null){
                    outImgStream.flush();
                    outImgStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
                e.getMessage();
            }
        }
    }

    private Rectangle CalcRotatedSize(Rectangle src, int angel) {
        if (angel >= 90) {
            if(angel / 90 % 2 == 1){
                int temp = src.height;
                src.height = src.width;
                src.width = temp;
            }
            angel = angel % 90;
        }

        double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2;
        double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r;
        double angel_alpha = (Math.PI - Math.toRadians(angel)) / 2;
        double angel_dalta_width = Math.atan((double) src.height / src.width);
        double angel_dalta_height = Math.atan((double) src.width / src.height);

        int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha
                - angel_dalta_width));
        int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha
                - angel_dalta_height));
        int des_width = src.width + len_dalta_width * 2;
        int des_height = src.height + len_dalta_height * 2;
        return new Rectangle(new Dimension(des_width, des_height));
    }
}

//旋转原图，注意旋转角度为弧度制。后面两个参数为旋转的坐标中心
// graphics2d.rotate(Math.toRa
// dians(30),
// bufferedImage.getWidth()/2,
// bufferedImage.getHeight()/2);
// int x = -width/2; int y = -height/2;
// while(x < width*1.5){
// y = -height/2;
// while(y < height*1.5){
// graphics2d.drawString(MARK_TEXT, x, y);
// y+=waterHeight+100;
// } x+=waterWidth+100; }
